#pragma once

#include <string>
#include <thread>
#include <memory>
#include <vector>

#include "base/event_loop.h"


namespace xrtc {

class SignalingWorker;    

// 信令服务器配置结构体
struct SignalingServerOptions {
    std::string m_host;
    int m_port;
    int m_worker_num;
    int m_connection_timeout;
};


class SignalingServer {
public:
    // 管道消息的类型
    enum {
        QUIT = 0
    };

    SignalingServer();
    ~SignalingServer();

    int init(const char* conf_file);
    // 创建工作线程并开启事件循环
    bool start();
    // 向管道发送停止事件循环的信号（由其它线程调用）
    void stop();
    // 向管道中写入数据
    int notify(int msg);
    // 等待工作线程结束
    void join();

    // 管道被写入的回调处理
    friend void signalingServerRecvNotify(EventLoop* el, IOWatcher* w, 
        int fd, int events, void* data);

    // 有新连接时的回调处理
    friend void acceptNewConn(EventLoop* el, IOWatcher* w, 
            int fd, int events, void* data);
        

private:
    // 处理写入管道中的数据
    void _processNotify(int msg);

    // 停止事件循环
    void _stop();

    // 创建工作线程
    int _createWorker(int worker_id);

    // 分发新连接
    void _dispatch_new_conn(int fd);

private:
    SignalingServerOptions m_options;
    EventLoop* m_el = nullptr;
    IOWatcher* m_io_watcher = nullptr;
    IOWatcher* m_pipe_watcher = nullptr;

    int m_notify_recv_fd = -1;
    int m_notify_send_fd = -1;
    int m_listen_fd = -1;

    std::unique_ptr<std::thread> m_thread;
    std::vector<SignalingWorker*> m_workers;
    int m_next_worker_index = 0;
};
    
    
} // namespace xrtc
